realtek: pcs: drop PCS creation without SerDes ref
authorJonas Jelonek <[email protected]>
Thu, 11 Dec 2025 22:37:33 +0000 (22:37 +0000)
committerRobert Marko <[email protected]>
Tue, 16 Dec 2025 12:37:31 +0000 (13:37 +0100)
Since the beginning, the PCS driver had the ability to call its
rtpcs_create without a reference to a valid PCS node. A comment in the
code mentions that this is done for RTL838X and its built-in octa-PHY
which is connected directly instead of via a SerDes. Further
explanations are not provided.

Drop this ability and make the rtpcs_create call in the dsa driver
conditional. As the built-in PHY of RTL838X isn't attached to a SerDes,
there is no obvious point of having the PCS driver in that chain. The
ports are marked as internal and have no pcs-handle, thus no phylink_pcs
instance should be created.

Signed-off-by: Jonas Jelonek <[email protected]>
Link: https://github.com/openwrt/openwrt/pull/21146
Signed-off-by: Robert Marko <[email protected]>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c
target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c

index 85818391b5ecde50441218245aa7506839f173d0..787ceda834d1dffd563c1bc0337f79c171a6b4df 100644 (file)
@@ -331,12 +331,14 @@ static int __init rtl83xx_mdio_probe(struct rtl838x_switch_priv *priv)
                        continue;
                }
 
-               priv->pcs[pn] = rtpcs_create(priv->dev, pcs_node, pn);
-               if (IS_ERR(priv->pcs[pn])) {
-                       dev_err(priv->dev, "port %u failed to create PCS instance: %ld\n",
-                               pn, PTR_ERR(priv->pcs[pn]));
-                       priv->pcs[pn] = NULL;
-                       continue;
+               if (pcs_node) {
+                       priv->pcs[pn] = rtpcs_create(priv->dev, pcs_node, pn);
+                       if (IS_ERR(priv->pcs[pn])) {
+                               dev_err(priv->dev, "port %u failed to create PCS instance: %ld\n",
+                                       pn, PTR_ERR(priv->pcs[pn]));
+                               priv->pcs[pn] = NULL;
+                               continue;
+                       }
                }
 
                if (of_get_phy_mode(dn, &interface))
index e41c89e71319b6bd80ee63a9f9bdf4e65b541741..8368870b620b106fbb1885503770ab61a7807398 100644 (file)
@@ -2930,26 +2930,12 @@ struct phylink_pcs *rtpcs_create(struct device *dev, struct device_node *np, int
        struct device_node *pcs_np;
        struct rtpcs_ctrl *ctrl;
        struct rtpcs_link *link;
-       int sds;
-
-       /*
-        * RTL838x devices have a built-in octa port RTL8218B PHY that is not attached via
-        * a SerDes. Allow to be called with an empty SerDes device node. In this case lookup
-        * the parent/driver node directly.
-        */
-       if (np) {
-               if (!of_device_is_available(np))
-                       return ERR_PTR(-ENODEV);
-
-               if (of_property_read_u32(np, "reg", &sds))
-                       return ERR_PTR(-EINVAL);
+       u32 sds;
 
-               pcs_np = of_get_parent(np);
-       } else {
-               pcs_np = of_find_compatible_node(NULL, NULL, "realtek,otto-pcs");
-               sds = -1;
-       }
+       if (!np || !of_device_is_available(np))
+               return ERR_PTR(-ENODEV);
 
+       pcs_np = of_get_parent(np);
        if (!pcs_np)
                return ERR_PTR(-ENODEV);
 
@@ -2972,7 +2958,9 @@ struct phylink_pcs *rtpcs_create(struct device *dev, struct device_node *np, int
        if (port < 0 || port > ctrl->cfg->cpu_port)
                return ERR_PTR(-EINVAL);
 
-       if (sds !=  -1 && rtpcs_sds_read(ctrl, sds, 0, 0) < 0)
+       if (of_property_read_u32(np, "reg", &sds))
+               return ERR_PTR(-EINVAL);
+       if (rtpcs_sds_read(ctrl, sds, 0, 0) < 0)
                return ERR_PTR(-EINVAL);
 
        link = kzalloc(sizeof(*link), GFP_KERNEL);